class Animal{
    constructor(type){
        this.type = type;
    }

    // 1. 实例上的属性
    // a = 123; //←这样声明是实例上的属性 es7语法

    // 2. 原形上的属性和方法
    // Animal.prototype.a = 456
    get a(){ // 原型上的属性 只能实例用
        return 456;
    }
    // set a(newVal){ }
    // Animal.prototype.eat = function(){console.log('eat')}
    eat(){
        console.log('eat')
    }

    // 3. 静态属性和方法
    // Animal.a
    // static say(){console.log('say')} //静态方法 es6可用
    // static a = 1; // es7静态属性 node不认 需要webpack babel 转译
    static get a(){ // 属性访问器 只能类用
        return this.flag;
    }
    static set a(newVal){
        this.flag = newVal
    }
}
Animal.flag = 'zzz';
Animal.a = 'hello';
console.log(Animal.a);
let animal = new Animal()

console.log(animal.hasOwnProperty('eat')); //false
console.log(Animal.hasOwnProperty('eat')); //false
console.log(Animal.prototype.hasOwnProperty('eat')); //true

/*class Tiger extends Animal{

}*/

/*
super 在构造函数中、在静态方法中 指的是父类
在原形方法中指代的是父类的原形
*/
class Tiger extends Animal{
    constructor(type){
        super(type); // Animal.call(this,type)
    }
    eat(){
        super.eat();
        console.log('吃肉');
    }
}

let tiger = new Tiger('哺乳类');
console.log('tiger.type:',tiger.type);
tiger.eat();
console.log('Tiger.a:',Tiger.a); //hello;静态属性也会被继承 Tiger.__proto__ = Animal

